package com.demo2_两数相加.text2_BigInteger;
/*
     需求: 给你两个非空 的链表，表示两个非负的整数。它们每位数字都是按照逆序的方式存储的，并且每个节点只能存储一位数字。

请你将两个数相加，并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外，这两个数都不会以 0开头。  2 -> 3 -> 4    4 -> 5 -> 6   实际是 432+654
  两链表数之和

 */

import java.math.BigInteger;

class ListNode {
    int val;  //  值
    ListNode next; // 下一个结点

    //空参构造
    ListNode() {

    }

    //带参构造
    ListNode(int val) {
        this.val = val;
    }

    //两种带参构造
    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }

    @Override
    public String toString() {
        return "ListNode{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }
}

public class Text2 {
    public static void main(String[] args) {
//        ListNode listNode2 = new ListNode(9, null);
//        ListNode listNode1 = new ListNode(9, listNode2);
//        ListNode listNode = new ListNode(1, listNode1);
//        System.out.println("链表一:");
//        System.out.println(listNode);
//
//        ListNode listNode5 = new ListNode(9, null);
//        ListNode listNode4=new ListNode(5,listNode5);
//        ListNode listNode3=new ListNode(4,listNode4);
//
//        System.out.println("链表二:");
//        System.out.println(listNode3);
//        //创建对象
//        Solution ss = new Solution();
//        ListNode listNode6 = ss.addTwoNumbers(listNode, listNode3);
//
//        System.out.println(listNode6);

        ListNode listNode=new ListNode(0,null);
        ListNode listNode1=new ListNode(0,null);
        Solution solution=new Solution();

        ListNode listNode2 = solution.addTwoNumbers(listNode, listNode1);
        System.out.println(listNode2);


    }
}

//解决方法
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        //1.先将2个链表的信息获取, 转为十进制数字  并 求和
        BigInteger sum=getNum(l1).add(getNum(l2));

        System.out.println("两数和为"+sum);

        //若和为0, 两个都为0,  那么直接返回(0,null)
        if (sum.equals(new BigInteger("0")))
            return new ListNode(0, null);
        //3.将该和转为链表的形式
        return getNode(sum);
    }

    //将链表转化为数
    public BigInteger getNum(ListNode l) {
        if (l == null)
            return new BigInteger("0");
        return new BigInteger(String.valueOf(l.val)).add(getNum(l.next).multiply(new BigInteger("10"))) ;
    }

    //将其转化为链表
    public ListNode getNode(BigInteger num) {
        //1.如果该数字为0,则说明为num在上一次循环已经是一个在  0  到 10 之间的数字了
        if (num.equals(new BigInteger("0")))//   该类已经重写了equals() 方法,比较两个值是否相等.
            return null;
        //2.将该数字对10取模
        BigInteger divideNum=new BigInteger("10");
        // 这个是获取商和余数.values[0] 是商,values[1] 是余数,
        BigInteger[] values= num.divideAndRemainder(divideNum);
        //3.调用BigInteger的intValue() 方法, 将其转为int类型.
        int value= values[1].intValue();

        return  new ListNode(value, getNode(values[0]));
    }
}